Mahdollista saumaton ja turvallinen tunnistautuminen. Tämä opas tutkii Credential Management API:a yhden napautuksen kirjautumisiin ja salasanattomiin ratkaisuihin.
Kirjautumisen sujuvoittaminen: Syväsukellus Frontend Credential Management API:hin
Digitaalisessa maailmassa kirjautumislomake on yksi kriittisimmistä mutta myös haastavimmista käyttäjäinteraktioista. Se on portti sovellukseesi, mutta myös merkittävä kitkan lähde. Käyttäjät unohtavat salasanoja, kirjoittavat käyttäjätunnuksia väärin ja hylkäävät ostoskoreja tai palveluita turhautuneina. Kehittäjille tunnistautumisen hallinta on monimutkainen tasapainottelu saumattoman käyttäjäkokemuksen (UX) ja vankan tietoturvan välillä.
Vuosien ajan tätä prosessia ovat auttaneet selaimen automaattinen täyttö ja kolmannen osapuolen salasananhallintaohjelmat. Vaikka ne ovat hyödyllisiä, niistä puuttuu usein standardoitu, ohjelmallinen tapa, jolla verkkosovellus voi olla vuorovaikutuksessa niiden kanssa. Tässä kohtaa kuvaan astuu Credential Management API (CredMan API). Se on W3C-standardi, joka tarjoaa selainkohtaisen mekanismin verkkosivustoille käyttäjien tunnistetietojen hallintaan, tasoittaen tietä yhden napautuksen kirjautumisille, automaattiselle tunnistautumiselle ja sujuvammalle siirtymälle kohti salasanatonta tulevaisuutta.
Tämä syväsukellus opastaa sinut kaiken läpi, mitä sinun tarvitsee tietää Credential Management API:sta. Tutkimme, mikä se on, miksi se on mullistava nykyaikaisille verkkosovelluksille ja miten voit ottaa sen käyttöön askel askeleelta mullistaaksesi tunnistautumisprosessisi.
Mikä on Credential Management API?
Credential Management API on JavaScript-pohjainen selain-API, joka standardoi verkkosivuston ja selaimen tunnistetietosäilön välisen vuorovaikutuksen. Ajattele sitä virallisena viestintäkanavana, joka antaa sovelluksesi ohjelmallisesti pyytää tunnistetietoja kirjautumista varten tai pyytää selainta tallentamaan tunnistetiedot rekisteröinnin jälkeen, kaikki käyttäjän nimenomaisella suostumuksella.
Se toimii abstraktiokerroksena, joka yksinkertaistaa sitä, miten kehittäjät käsittelevät erilaisia tunnistetietoja. Sen sijaan, että käsiteltäisiin vain raakoja käyttäjätunnus- ja salasanakenttiä, API toimii rakenteellisten tunnistetieto-objektien kanssa. Se tukee kolmea päätyyppiä:
- PasswordCredential: Perinteinen käyttäjätunnuksen ja salasanan yhdistelmä.
- FederatedCredential: Identiteettivahvistus federatiiviselta identiteetintarjoajalta, kuten Googlelta, Facebookilta tai yrityksen SAML-tarjoajalta.
- PublicKeyCredential: Tehokas, tietojenkalastelua kestävä tunnistetyyppi, jota käytetään salasanattomaan tunnistautumiseen WebAuthn-standardin kautta. Tähän liittyy usein biometrisiä tietoja (sormenjälki, kasvojentunnistus) tai laitteistopohjaisia turva-avaimia.
Tarjoamalla yhden, yhtenäisen käyttöliittymän—`navigator.credentials`-objektin—API antaa sinun rakentaa hienostuneita tunnistautumisprosesseja, jotka ovat sekä uskomattoman käyttäjäystävällisiä että turvallisia, riippumatta taustalla olevasta tunnistetyypistä.
Miksi sovelluksesi tarvitsee Credential Management API:a
CredMan API:n integrointi ei ole vain uusimman teknologian omaksumista; se on konkreettisten hyötyjen toimittamista käyttäjillesi ja kehitystiimillesi.
1. Radikaalisti parannettu käyttäjäkokemus (UX)
Tämä on epäilemättä merkittävin etu. API puuttuu suoraan kirjautumisen kitkaan.
- Yhden napautuksen kirjautuminen: Palaaville käyttäjille selain voi näyttää tilinvalitsimen, jonka avulla he voivat kirjautua sisään yhdellä napautuksella tai napsautuksella ilman salasanan kirjoittamista.
- Automaattinen kirjautuminen: Voit määrittää API:n kirjaamaan palaavan käyttäjän sisään automaattisesti heti, kun hän vierailee sivustollasi, tarjoten yhtä saumattoman kokemuksen kuin natiivi mobiilisovellus. Tämä sopii täydellisesti käyttäjille, jotka eivät ole erikseen kirjautuneet ulos.
- Vähemmän lomakkeiden hylkäämisiä: Yksinkertaistamalla kirjautumis- ja rekisteröintiprosessia vähennät käyttäjien kognitiivista kuormitusta, mikä johtaa korkeampiin suoritusasteisiin ja parempaan käyttäjien pysyvyyteen.
- Yhtenäiset federatiiviset kirjautumiset: Se sujuvoittaa "Kirjaudu sisään..." -kokemusta. Sen sijaan, että hallinnoisit ponnahdusikkunoita ja uudelleenohjauksia manuaalisesti, API tarjoaa standardoidun tavan pyytää federatiivista identiteettiä, jota selain voi välittää.
2. Parempi tietoturva
Samalla kun API parantaa käyttäjäkokemusta, se tuo myös merkittäviä tietoturvaparannuksia.
- Tietojenkalastelun kestävyys: API:n hallinnoimat tunnistetiedot on sidottu tiettyyn alkuperään (protokolla, verkkotunnus ja portti). Tämä tarkoittaa, että selain ei tarjoa `yourbank.com`-sivuston tunnistetietoja tietojenkalastelusivustolla, kuten `your-bank.com`, mikä on yleinen hyökkäysvektori, jolle perinteinen salasanojen automaattitäyttö voi olla altis.
- Portti salasanattomuuteen: API on nimetty sisäänpääsypiste WebAuthn:lle (`PublicKeyCredential`). Ottamalla sen käyttöön salasanapohjaisissa kirjautumisissa rakennat perustan, jonka päälle on helppo lisätä salasanaton, biometrinen tai laitteistoavainten tunnistautuminen tulevaisuudessa.
- Standardoitu ja testattu: Se tarjoaa selaimen testaaman, standardoidun käyttöliittymän arkaluonteisten tunnistetietojen käsittelyyn, mikä vähentää toteutusvirheiden riskiä, jotka voisivat paljastaa käyttäjätietoja.
3. Yksinkertaistettu ja tulevaisuudenkestävä kehitys
API tarjoaa puhtaan, Promise-pohjaisen käyttöliittymän, joka yksinkertaistaa monimutkaista tunnistautumislogiikkaa.
- Abstrahoitu monimutkaisuus: Sinun ei tarvitse huolehtia siitä, missä tunnistetiedot on tallennettu (selaimen sisäinen hallinta, käyttöjärjestelmätason avainnippu jne.). Teet vain pyynnön, ja selain hoitaa loput.
- Puhtaampi koodipohja: Se auttaa siirtymään pois sotkuisesta lomakkeiden kaavinta- ja tapahtumankäsittelylogiikasta kirjautumista ja rekisteröintiä varten, mikä johtaa ylläpidettävämpään koodiin.
- Eteenpäin suuntautuva yhteensopivuus: Kun uusia tunnistautumismenetelmiä syntyy, ne voidaan integroida Credential Management API -kehykseen. Rakentamalla tämän standardin päälle sovelluksesi on paremmin valmistautunut verkkotunnistautumisen tulevaisuuteen.
Ydinkäsitteet ja API:n syväsukellus
Koko API pyörii `navigator.credentials`-objektin ympärillä, joka paljastaa joukon metodeja tunnistetietojen hallintaan. Käydään läpi tärkeimmät niistä.
`get()`-metodi: Tunnistetietojen noutaminen kirjautumista varten
Tämä on kirjautumisprosessin työjuhta. Käytät `navigator.credentials.get()`-metodia pyytääksesi selaimelta tunnistetietoja, joita voidaan käyttää käyttäjän tunnistamiseen. Se palauttaa Promisen, joka ratkeaa `Credential`-objektilla tai `null`-arvolla, jos tunnistetietoja ei löytynyt tai käyttäjä perui pyynnön.
`get()`-metodin voima piilee sen konfiguraatio-objektissa. Keskeinen ominaisuus on `mediation`, joka hallitsee käyttäjävuorovaikutuksen tasoa:
mediation: 'silent': Tämä on automaattista kirjautumista varten. Se käskee selainta noutamaan tunnistetiedot ilman käyttäjän vuorovaikutusta. Jos se vaatii käyttöliittymäkehotteen (esim. käyttäjä on kirjautunut useille tileille), pyyntö epäonnistuu hiljaa. Tämä on ihanteellinen tarkistamaan sivun latautuessa, onko käyttäjällä aktiivinen istunto.mediation: 'optional': Tämä on oletusarvo. Selain voi tarvittaessa näyttää käyttöliittymän, kuten tilinvalitsimen. Se sopii täydellisesti käyttäjän käynnistämään kirjautumispainikkeeseen.mediation: 'required': Tämä pakottaa selaimen aina näyttämään käyttöliittymän, mikä voi olla hyödyllistä tietoturvakriittisissä yhteyksissä, joissa haluat uudelleentunnistaa käyttäjän nimenomaisesti.
Esimerkki: Salasanatunnistetiedon pyytäminen
async function signInUser() {
try {
const cred = await navigator.credentials.get({
password: true,
mediation: 'optional' // tai 'silent' automaattista kirjautumista varten
});
if (cred) {
// Tunnistetieto-objekti palautettiin
// Lähetä se palvelimelle vahvistettavaksi
await serverLogin(cred);
} else {
// Käyttäjä perui kehotteen tai tunnistetietoja ei ole saatavilla
// Palataan manuaaliseen lomakkeen syöttöön
}
} catch (e) {
console.error('Virhe tunnistetietojen haussa:', e);
}
}
`create()`- ja `store()`-metodit: Tunnistetietojen tallentaminen
Kun käyttäjä rekisteröityy tai päivittää salasanansa, tarvitset tavan kertoa selaimelle, että se tallentaa nämä uudet tiedot. API tarjoaa tähän kaksi metodia.
`navigator.credentials.create()`-metodia käytetään pääasiassa uuden tunnistetiedon luomiseen, erityisesti `PublicKeyCredential` (WebAuthn) -tapauksessa, jossa luodaan avainpari. Salasanoille se rakentaa `PasswordCredential`-objektin, jonka voit sitten antaa `navigator.credentials.store()`-metodille.
`navigator.credentials.store()` ottaa vastaan tunnistetieto-objektin ja kehottaa selainta tallentamaan sen. Tämä on yleisin tapa tallentaa käyttäjätunnus/salasana-tiedot onnistuneen rekisteröinnin jälkeen.
Esimerkki: Uuden salasanatunnistetiedon tallentaminen rekisteröinnin jälkeen
async function handleRegistration(form) {
// 1. Lähetä lomaketiedot palvelimellesi
const response = await serverRegister(form);
// 2. Jos rekisteröinti onnistuu, luo tunnistetieto-objekti
if (response.ok) {
const newCredential = new PasswordCredential({
id: form.username.value,
password: form.password.value,
name: form.displayName.value,
iconURL: 'https://example.com/path/to/icon.png'
});
// 3. Pyydä selainta tallentamaan se
try {
await navigator.credentials.store(newCredential);
console.log('Tunnistetieto tallennettu onnistuneesti!');
} catch (e) {
console.error('Virhe tunnistetietojen tallennuksessa:', e);
}
}
}
`preventSilentAccess()`-metodi: Uloskirjautumisen käsittely
Tämä metodi on ratkaisevan tärkeä täydellisen ja turvallisen tunnistautumisen elinkaaren kannalta. Kun käyttäjä kirjautuu nimenomaisesti ulos sovelluksestasi, haluat estää `mediation: 'silent'` -prosessia kirjaamasta häntä automaattisesti takaisin sisään seuraavalla vierailulla.
`navigator.credentials.preventSilentAccess()`-kutsu poistaa hiljaisen, automaattisen kirjautumisominaisuuden käytöstä, kunnes käyttäjä seuraavan kerran kirjautuu sisään vuorovaikutteisesti (ts. ei hiljaisesti). Se on yksinkertainen, kerran suoritettava Promise.
Esimerkki: Uloskirjautumisprosessi
async function handleSignOut() {
// 1. Mitätöi istunto palvelimellasi
await serverLogout();
// 2. Estä hiljainen uudelleenkirjautuminen asiakaspuolella
if (navigator.credentials && navigator.credentials.preventSilentAccess) {
await navigator.credentials.preventSilentAccess();
}
// 3. Uudelleenohjaa etusivulle tai kirjautumissivulle
window.location.href = '/';
}
Käytännön toteutus: Täydellisen tunnistautumisprosessin rakentaminen
Yhdistetään nämä käsitteet vankaksi, päästä päähän -tunnistautumiskokemukseksi.
Vaihe 1: Ominaisuuksien tunnistus
Tarkista aina ensin, tukeeko selain API:a, ennen kuin yrität käyttää sitä. Tämä varmistaa hallitun heikentymisen vanhemmille selaimille.
const isCredManApiSupported = ('credentials' in navigator);
if (isCredManApiSupported) {
// Jatka API-pohjaisilla prosesseilla
} else {
// Palataan perinteiseen lomakelogikkaan
}
Vaihe 2: Automaattinen kirjautumisprosessi (sivun latautuessa)
Kun käyttäjä vierailee sivustollasi, voit yrittää kirjauttaa hänet sisään automaattisesti, jos hänellä on olemassa oleva istunto tallennettuna selaimen tunnistetietojen hallintaan.
window.addEventListener('load', async () => {
if (!isCredManApiSupported) return;
try {
const cred = await navigator.credentials.get({
password: true,
mediation: 'silent'
});
if (cred) {
console.log('Hiljainen kirjautuminen onnistui. Vahvistetaan palvelimella...');
// Lähetä tunnistetieto taustajärjestelmään vahvistusta ja istunnon luomista varten
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: cred.id, password: cred.password })
});
if (response.ok) {
// Päivitä käyttöliittymä näyttämään kirjautunut tila
updateUIAfterLogin();
}
}
// Jos 'cred' on null, älä tee mitään. Käyttäjä näkee normaalin kirjautumissivun.
} catch (e) {
console.info('Hiljainen get() epäonnistui. Tämä on odotettua, jos käyttäjä on kirjautunut ulos.', e);
}
});
Vaihe 3: Käyttäjän käynnistämä kirjautumisprosessi (painikkeen napsautuksella)
Kun käyttäjä napsauttaa "Kirjaudu sisään" -painiketta, käynnistät interaktiivisen prosessin.
const signInButton = document.getElementById('signin-button');
signInButton.addEventListener('click', async () => {
if (!isCredManApiSupported) {
// Anna perinteisen lomakkeen lähetyksen hoitaa asia
return;
}
try {
const cred = await navigator.credentials.get({
password: true,
mediation: 'optional'
});
if (cred) {
// Käyttäjä valitsi tilin selaimen tilinvalitsimesta
document.getElementById('username').value = cred.id;
document.getElementById('password').value = cred.password;
// Lähetä lomake ohjelmallisesti tai fetch-kutsulla
document.getElementById('login-form').submit();
} else {
// Käyttäjä sulki tilinvalitsimen. Anna hänen kirjoittaa tiedot manuaalisesti.
console.log('Käyttäjä perui kirjautumiskehotteen.');
}
} catch (e) {
console.error('Virhe käyttäjän käynnistämässä kirjautumisessa:', e);
}
});
Vaihe 4: Rekisteröinti ja tunnistetietojen tallennus
Kun uusi käyttäjä on rekisteröitynyt onnistuneesti, kehota selainta tallentamaan hänen tunnistetietonsa.
const registrationForm = document.getElementById('registration-form');
registrationForm.addEventListener('submit', async (event) => {
event.preventDefault();
// Oletetaan, että palvelinpuolen rekisteröinti onnistuu
// ...palvelinlogiikka tähän...
if (isCredManApiSupported) {
const form = event.target;
const cred = new PasswordCredential({
id: form.username.value,
password: form.password.value,
name: form.fullName.value
});
try {
await navigator.credentials.store(cred);
// Uudelleenohjaa nyt käyttäjän hallintapaneeliin
window.location.href = '/dashboard';
} catch (e) {
console.warn('Tunnistetietoja ei voitu tallentaa.', e);
// Uudelleenohjaa silti, koska rekisteröinti onnistui
window.location.href = '/dashboard';
}
} else {
// Tuetuille selaimille, uudelleenohjaa vain
window.location.href = '/dashboard';
}
});
Vaihe 5: Uloskirjautumisprosessi
Varmista lopuksi puhdas uloskirjautumisprosessi.
const signOutButton = document.getElementById('signout-button');
signOutButton.addEventListener('click', async () => {
// 1. Käske palvelinta päättämään istunto
await fetch('/api/logout', { method: 'POST' });
// 2. Estä automaattinen kirjautuminen seuraavalla vierailulla
if (isCredManApiSupported) {
try {
await navigator.credentials.preventSilentAccess();
} catch(e) {
console.error("Hiljaista pääsyä ei voitu estää.", e)
}
}
// 3. Uudelleenohjaa käyttäjä
window.location.href = '/signed-out';
});
Integrointi federatiivisten identiteetintarjoajien kanssa
API:n eleganssi ulottuu federatiivisiin kirjautumisiin. Sen sijaan, että hallinnoisit monimutkaisia SDK:ita ja ponnahdusikkunoita suoraan, voit käyttää `FederatedCredential`-tyyppiä. Määrität sivustosi tukemat identiteetintarjoajat, ja selain voi esittää ne omassa natiivissa käyttöliittymässään.
async function federatedSignIn() {
try {
const fedCred = await navigator.credentials.get({
federated: {
providers: ['https://accounts.google.com', 'https://www.facebook.com'],
// Voit myös sisällyttää OpenID Connect -parametreja
// protocols: ['openidconnect'],
// clientId: 'your-client-id.apps.googleusercontent.com'
}
});
if (fedCred) {
// fedCred.id sisältää käyttäjän yksilöllisen tunnisteen palveluntarjoajalta
// fedCred.provider sisältää palveluntarjoajan alkuperän (esim. 'https://accounts.google.com')
// Lähetä tämä token/tunniste taustajärjestelmään vahvistusta ja istunnon luomista varten
await serverFederatedLogin(fedCred.id, fedCred.provider);
}
} catch (e) {
console.error('Federatiivinen kirjautuminen epäonnistui:', e);
}
}
Tämä lähestymistapa antaa selaimelle enemmän kontekstia käyttäjän identiteettisuhteista, mikä voi johtaa virtaviivaisempaan ja luotettavampaan käyttäjäkokemukseen tulevaisuudessa.
Tulevaisuus on salasanaton: WebAuthn-integraatio
Credential Management API:n todellinen voima on sen rooli asiakaspuolen sisäänpääsypisteenä WebAuthn:lle. Kun olet valmis toteuttamaan salasanattoman tunnistautumisen, sinun ei tarvitse opetella täysin uutta API:a. Käytät yksinkertaisesti `create()`- ja `get()`-metodeja `publicKey`-vaihtoehdolla.
WebAuthn-prosessi on monimutkaisempi ja sisältää kryptografisen haaste-vastaus-mekanismin palvelimesi kanssa, mutta käyttöliittymän vuorovaikutus hoidetaan saman API:n kautta, jota jo käytät salasanoille.
Yksinkertaistettu WebAuthn-rekisteröintiesimerkki:
// 1. Hae haaste palvelimeltasi
const challenge = await fetch('/api/webauthn/register-challenge').then(r => r.json());
// 2. Käytä navigator.credentials.create() -metodia publicKey-asetuksilla
const newPublicKeyCred = await navigator.credentials.create({
publicKey: challenge
});
// 3. Lähetä uusi tunnistetieto takaisin palvelimelle vahvistettavaksi ja tallennettavaksi
await fetch('/api/webauthn/register-verify', {
method: 'POST',
body: JSON.stringify(newPublicKeyCred)
});
Käyttämällä CredMan API:a tänään, rakennat sovelluksesi valmiiksi väistämätöntä siirtymää kohti turvallisempia, tietojenkalastelua kestäviä tunnistautumismenetelmiä.
Selaintuki ja tietoturvahuomiot
Selainyhteensopivuus
Credential Management API on laajalti tuettu nykyaikaisissa selaimissa, mukaan lukien Chrome, Firefox ja Edge. Safarin tuki on kuitenkin rajoitetumpi, erityisesti tiettyjen ominaisuuksien osalta. Tarkista aina yhteensopivuusresurssi, kuten Can I Use..., saadaksesi ajantasaisimmat tiedot ja varmista, että sovelluksesi heikentyy hallitusti pitämällä tavalliset HTML-lomakkeesi täysin toimivina.
Kriittiset tietoturvan parhaat käytännöt
- HTTPS on pakollinen: Kuten monet nykyaikaiset web-API:t, jotka käsittelevät arkaluonteisia tietoja, Credential Management API on saatavilla vain suojatuissa yhteyksissä. Sivustosi on tarjottava HTTPS-yhteyden kautta.
- Palvelinpuolen vahvistus on ehdoton: API on asiakaspuolen mukavuus. Se auttaa saamaan tunnistetiedot käyttäjältä sovellukseesi. Se ei vahvista niitä. ÄLÄ KOSKAAN luota asiakaspuoleen. Kaikki tunnistetiedot, olivatpa ne salasanapohjaisia tai kryptografisia, on vahvistettava turvallisesti taustajärjestelmässäsi ennen istunnon myöntämistä.
- Kunnioita käyttäjän tarkoitusta: Käytä `mediation: 'silent'` vastuullisesti. Se on tarkoitettu istuntojen palauttamiseen, ei käyttäjien seuraamiseen. Yhdistä se aina vankkaan uloskirjautumisprosessiin, joka kutsuu `preventSilentAccess()`-metodia.
- Käsittele `null`-arvo hallitusti: `get()`-kutsun ratkeaminen `null`-arvoon ei ole virhe. Se on normaali osa prosessia, joka tarkoittaa, että käyttäjällä ei joko ole tallennettuja tunnistetietoja tai hän perui selainkehotteen. Käyttöliittymäsi tulisi saumattomasti sallia heidän jatkaa manuaalisella syötöllä.
Yhteenveto
Frontend Credential Management API edustaa perustavanlaatuista kehitystä siinä, miten verkkosovellukset käsittelevät tunnistautumista. Se siirtää meidät pois hauraista, kitkaa aiheuttavista lomakkeista kohti standardoitua, turvallista ja käyttäjäkeskeistä mallia. Toimimalla siltana sovelluksesi ja selaimen tehokkaan tunnistetietosäilön välillä se antaa sinun toimittaa saumattomia yhden napautuksen kirjautumisia, elegantteja federatiivisia kirjautumisia ja selkeän polun kohti salasanatonta tulevaisuutta WebAuthn:n avulla.
Tämän API:n omaksuminen on strateginen investointi. Se parantaa käyttäjäkokemustasi, mikä voi suoraan vaikuttaa konversioon ja pysyvyyteen. Se vahvistaa tietoturvaasi yleisiä uhkia, kuten tietojenkalastelua, vastaan. Ja se yksinkertaistaa frontend-koodiasi, tehden siitä ylläpidettävämmän ja tulevaisuudenkestävämmän. Maailmassa, jossa käyttäjän ensivaikutelma on usein kirjautumisnäyttö, Credential Management API tarjoaa työkalut, joita tarvitset tehdäkseen siitä vaikutelmasta positiivisen ja vaivattoman.